
package highvoltage;

import highvoltage.skeletonHelpers.Logger;

/**
 * A civil jármûvet jelképezõ osztály.
 * 
 * @author Tomi
 * @version 1.0
 * @created 16-márc.-2010 21:08:05
 */
public class Civilian extends Vehicle
{
	/**
	 * A létrehozott példányok száma.
	 */
	private static int __instances;

	public Civilian()
	{
		Logger.print( "Civilian::Civilian()", this );

		Logger.call( "RandomStrategy::RandomStrategy()" );
		_strategy = new RandomStrategy();

		Logger.ret();
	}

	/**
	 * Visszatér a példányok számával.
	 */
	public static int getInstanceCount()
	{
		Logger.print( "Civilian::getInstanceCount()" );
		Logger.ret();

		return 0;
	}

	/**
	 * A jármű megsemmisítésére hivatott metódus.
	 * Eggyel csökkenti a példányok számát.
	 */
	
	@Override
	public void kill()
	{
		Logger.print( "Civilian::kill()" );

		Civilian.__instances--;

		Logger.call( "Vehicle::kill()" );
		super.kill();
		
		Logger.ret();
	}
	
	/**
	 * A civil Visitor minta szerinti accept metódusa. Alkalmazzuk a szabályok
	 * értékelésénél és az ütközéseknél.
	 * 
	 * @param visitor
	 *            Egy IRuleVisitor interfészt megvalósító objektum.
	 */
	public void accept( IVehicleVisitor visitor )
	{
		Logger.print( String.format( "Civilian::accept(IVehicleVisitor visitor | %d)", visitor.hashCode() ), this );

		Logger.call( "IVehicleVisitor::visitVehicle()" );
		visitor.visitVehicle( this );

		Logger.ret();
	}

	/**
	 * A Visitor minta szerinti visit metódus.
	 * 
	 * @param rule
	 *            SpeedLimit típusú szabály.
	 */
	public void visitRule( SpeedLimit rule )
	{
		Logger.print( "Civilian::visitRule(SpeedLimit rule)", this );
		Logger.ret();
	}

	/**
	 * A Visitor minta szerinti visit metódus.
	 * 
	 * @param rule
	 *            TrafficLight típusú szabály.
	 */
	public void visitRule( TrafficLight rule )
	{
		Logger.print( "Civilian::visitRule(TrafficLight rule)", this );
		Logger.ret();
	}

	/**
	 * A Visitor minta szerinti visit metódus.
	 * 
	 * @param rule
	 *            StopSign típusú szabály.
	 */
	public void visitRule( StopSign rule )
	{
		Logger.print( "Civilian::visitRule(StopSign rule)", this );
		Logger.ret();
	}

	/**
	 * Az ütközõ jármû típusától függõ események elindítása.
	 * 
	 * @param vehicle
	 *            Police típusú jármû.
	 */
	public void visitVehicle( Police vehicle )
	{
		Logger.print( "Civilian::visitVehicle(Police vehicle)", this );
		Logger.ret();
	}

	/**
	 * Az ütközõ jármû típusától függõ események elindítása.
	 * 
	 * @param vehicle
	 *            Civilian típusú jármû.
	 */
	public void visitVehicle( Civilian vehicle )
	{
		Logger.print( "Civilian::visitVehicle(Civilian vehicle)", this );
		Logger.ret();
	}

	/**
	 * Az ütközõ jármû típusától függõ események elindítása.
	 * 
	 * @param vehicle
	 *            Robber típusú jármû.
	 */
	public void visitVehicle( Robber vehicle )
	{
		Logger.print( "Civilian::visitVehicle(Robber vehicle)", this );

		Logger.call( "Robber::decreaseLives()" );
		vehicle.decreaseLives();
		
		Logger.call( "Civilian::kill()", this );
		this.kill();

		Logger.ret();
	}
}
